// Copyright 2021 Tencent Inc. All rights reserved.
//
// 商家转账对外API（2025年1月15日升级版本）
//
// 发起转账
// [https://pay.weixin.qq.com/doc/v3/merchant/4012716434](https://pay.weixin.qq.com/doc/v3/merchant/4012716434)
// 商家转账用户确认模式下，用户申请收款时，商户可通过此接口申请创建转账单
// 接口返回的HTTP状态码及错误码，仅代表本次请求的结果，不能代表订单状态。
// 接口返回的HTTP状态码为200，且状态为WAIT_USER_CONFIRM时，可认为创建转账单成功，可引导用户确认收款。其余状态请参考开发指引中的状态机描述进行处理。
// 接口返回的HTTP状态码不为200时，请商户务必不要立即更换商户订单号重试。可根据错误码列表中的描述和接口返回的信息进行处理，并在查询原订单结果为失败或者联系客服确认情况后，再更换商户订单号进行重试。否则会有重复转账的资金风险。
// 注：单个商户的接口频率限制为100次/s
//
// API version: 1.0.0

// Code generated by WechatPay APIv3 Generator based on [OpenAPI
// Generator](https://openapi-generator.tech); DO NOT EDIT.

package com.wechat.pay.java.service.mchtransfer.model;

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.List;
import java.util.function.UnaryOperator;

import static com.wechat.pay.java.core.util.StringUtil.toIndentedString;

/** InitiateMchTransferRequest */
public class InitiateMchTransferRequest {
    /**
     * 【商户AppID】 是微信开放平台和微信公众平台为开发者的应用程序(APP、小程序、公众号、企业号corpid即为此AppID)提供的一个唯一标识。
     * 此处，可以填写这四种类型中的任意一种APPID，但请确保该appid与商户号有绑定关系。 详见：<a
     * href="https://pay.weixin.qq.com/doc/v3/merchant/4013070756">普通商户模式开发必要参数说明</a>。
     */
    @SerializedName("appid")
    private String appid;

    /** 【商户单号】 商户系统内部的商家单号，要求此参数只能由数字、大小写字母组成，在商户系统内部唯一 */
    @SerializedName("out_bill_no")
    private String outBillNo;

    /** 【转账场景ID】 该笔转账使用的转账场景，可前往“商户平台-产品中心-商家转账”中申请。如：1000（现金营销），1006（企业报销）等 */
    @SerializedName("transfer_scene_id")
    private String transferSceneId;

    /**
     * 【收款用户OpenID】 用户在商户appid下的唯一标识。 发起转账前需获取到用户的OpenID，获取方式详见 <a
     * href="https://pay.weixin.qq.com/doc/v3/merchant/4012068676">参数说明</a>。
     */
    @SerializedName("openid")
    private String openid;

    /**
     * 【收款用户姓名】 收款方真实姓名。需要加密传入，支持标准RSA算法和国密算法，公钥由微信侧提供。<br>
     * 转账金额 >= 2,000元时，该笔明细必须填写<br>
     * 若商户传入收款用户姓名，微信支付会校验收款用户与输入姓名是否一致，并提供电子回单
     */
    @SerializedName("user_name")
    private String userName;

    /** 【转账金额】 转账金额单位为“分”。 */
    @SerializedName("transfer_amount")
    private Long transferAmount;

    /** 【转账备注】 转账备注，用户收款时可见该备注信息，UTF8编码，最多允许32个字符 */
    @SerializedName("transfer_remark")
    private String transferRemark;

    /** 【通知地址】 异步接收微信支付结果通知的回调地址，通知url必须为公网可访问的URL，必须为HTTPS，不能携带参数。 */
    @SerializedName("notify_url")
    private String notifyUrl;

    /**
     * 【用户收款感知】 用户收款时感知到的收款原因将根据转账场景自动展示默认内容。如有其他展示需求，可在本字段传入。 各场景展示的默认内容和支持传入的内容，可查看<a
     * href="https://pay.weixin.qq.com/doc/v3/merchant/4012711988#2.3-%E5%8F%91%E8%B5%B7%E8%BD%AC%E8%B4%A6">产品</a>文档了解。
     */
    @SerializedName("user_recv_perception")
    private String userRecvPerception;

    /**
     * 【转账场景报备信息】 各转账场景下需报备的内容，商户需要按照所属转账场景规则传参， 详见<a
     * href="https://pay.weixin.qq.com/doc/v3/merchant/4013774588">转账场景报备信息字段说明</a>。
     */
    @SerializedName("transfer_scene_report_infos")
    private List<TransferSceneReportInfo> transferSceneReportInfos;

    public String getAppid() {
        return appid;
    }

    public InitiateMchTransferRequest setAppid(String appid) {
        this.appid = appid;
        return this;
    }

    public String getOutBillNo() {
        return outBillNo;
    }

    public InitiateMchTransferRequest setOutBillNo(String outBillNo) {
        this.outBillNo = outBillNo;
        return this;
    }

    public String getTransferSceneId() {
        return transferSceneId;
    }

    public InitiateMchTransferRequest setTransferSceneId(String transferSceneId) {
        this.transferSceneId = transferSceneId;
        return this;
    }

    public String getOpenid() {
        return openid;
    }

    public InitiateMchTransferRequest setOpenid(String openid) {
        this.openid = openid;
        return this;
    }

    public String getUserName() {
        return userName;
    }

    public InitiateMchTransferRequest setUserName(String userName) {
        this.userName = userName;
        return this;
    }

    public Long getTransferAmount() {
        return transferAmount;
    }

    public InitiateMchTransferRequest setTransferAmount(Long transferAmount) {
        this.transferAmount = transferAmount;
        return this;
    }

    public String getTransferRemark() {
        return transferRemark;
    }

    public InitiateMchTransferRequest setTransferRemark(String transferRemark) {
        this.transferRemark = transferRemark;
        return this;
    }

    public String getNotifyUrl() {
        return notifyUrl;
    }

    public InitiateMchTransferRequest setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
        return this;
    }

    public String getUserRecvPerception() {
        return userRecvPerception;
    }

    public InitiateMchTransferRequest setUserRecvPerception(String userRecvPerception) {
        this.userRecvPerception = userRecvPerception;
        return this;
    }

    public List<TransferSceneReportInfo> getTransferSceneReportInfos() {
        return transferSceneReportInfos;
    }

    public InitiateMchTransferRequest setTransferSceneReportInfos(List<TransferSceneReportInfo> transferSceneReportInfos) {
        this.transferSceneReportInfos = transferSceneReportInfos;
        return this;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("class InitiateMchTransferRequest {\n");
        sb.append("    appid: ").append(toIndentedString(appid)).append("\n");
        sb.append("    outBillNo: ").append(toIndentedString(outBillNo)).append("\n");
        sb.append("    transferSceneId: ").append(toIndentedString(transferSceneId)).append("\n");
        sb.append("    openid: ").append(toIndentedString(openid)).append("\n");
        sb.append("    userName: ").append(toIndentedString(userName)).append("\n");
        sb.append("    transferAmount: ").append(toIndentedString(transferAmount)).append("\n");
        sb.append("    transferRemark: ").append(toIndentedString(transferRemark)).append("\n");
        sb.append("    notifyUrl: ").append(toIndentedString(notifyUrl)).append("\n");
        sb.append("    userRecvPerception: ").append(toIndentedString(userRecvPerception)).append("\n");
        sb.append("    transferSceneReportInfos: ")
                .append(toIndentedString(transferSceneReportInfos))
                .append("\n");
        sb.append("}");
        return sb.toString();
    }

    public InitiateMchTransferRequest cloneWithCipher(UnaryOperator<String> s) {
        InitiateMchTransferRequest copy = new InitiateMchTransferRequest();
        copy.appid = appid;
        copy.outBillNo = outBillNo;
        copy.transferSceneId = transferSceneId;
        copy.openid = openid;
        copy.userName = s.apply(userName);
        copy.transferAmount = transferAmount;
        copy.transferRemark = transferRemark;
        copy.notifyUrl = notifyUrl;
        copy.userRecvPerception = userRecvPerception;
        if (transferSceneReportInfos != null && !transferSceneReportInfos.isEmpty()) {
            copy.transferSceneReportInfos = new ArrayList<>();
            for (TransferSceneReportInfo val : transferSceneReportInfos) {
                if (val != null) {
                    copy.transferSceneReportInfos.add(val.cloneWithCipher(s));
                }
            }
        }
        return copy;
    }
}